package JVM.old;

/**
 *  GC
 *  怎样确定垃圾
 * 怎样确定他是垃圾 :内存已经不再使用   可达性分析
 *              1.引用计数法 用到它+1   不用-1   到0是垃圾
 *              2.从GC Roots  为起点  引用不可达  则为垃圾    应用可达   不是垃圾
 *
 * 谁可以成为GC Roots:   1.虚拟机栈(栈帧中的局部变量区，也叫做局部变量表)中引用的对象。
 *                     2.方法区中的类静态属性引用的对象
 *                     3.方法区中常量引用的对象
 *                     4.本地方法栈JNI（Native方法）引用的对象
 *
 * 并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事。
 *  无论从微观还是从宏观来看，二者都是一起执行的。
 * 并发:一个CPU (采用时间片)同时执行多个任务。比如:秒杀、多个人做同一件事|
 * 宏观上具有多个进程同时执行的效果，但在微观上并不是同时执行的
 * 4种垃圾回收器
 *     1.Serial（串行）//它为单线程环境设计且只使用一个线程进行垃圾回收，会暂停所有的用户线程。所以不适合服务器环境
 *        -XX:+UseSerialGC
 *     2.Parallel（并行）//多个垃圾收集线程并行工作，此时用户线程是暂停的，适用于科学计算/大数据处理首台处理等弱交互场景
 *        -XX:+UseParallelGC//JDK8默认
 *     3.CMS（并发）//用户线程和垃圾收集线程同时执行(不一定是并行，可能交替执行)，不需要停顿用户线程
 *                 //互联网公司多用它，适用对响应时间有要求的场景
 *         -XX:+UseConcMarkSweepGC
 *         1.初始标记(CMS initial mark) //记录GC Roots位置  会停顿
 *         2.并发标记(CMS concurrent mark)和用户线程一起
 *         3.重新标记(CMS remark)// 二次确认 会停顿
 *         4.并发清除(CMS concurrent sweep)和用户线程一起
 *         优点:并发收集底停顿
 *         缺点:对CPU的资源压力大，标记清除有大量碎片
 *         -XX:CMSFullGCsBeForeCompaction(默认0， 即每次都进行内存整理（标记压缩）)
 *     4.G1//将堆内存分割成不同区域  分别进行CMS（并发）
 *       XX:+UseG1GC
 *     5.ZGC(0..jdk11及以后）
 *
 * UseSerialGC
 * UseSerialOldGC//以前有  废弃了
 * UseParNewGC//并行年轻代GC
 * UseParallelOldGC//并行老年代GC
 *   -XX:+UseParallelGC===-XX:+UseParallelOldGC//互相激活
 *
 * java -XX:+PrintCommandLineFlags -version//查看默认设置
 *
 *
 * 7种垃圾回收器
 * Young Gen(新生代)：
 *      1.Serial Copying
 *          Serial(串行收集器)  //会暂停其他一切工作线程
 *          -XX:+UseSerialGC  //开启  自动激活Old的1
 *      2.Parallel Scavenge
 *          自动激活 老年代2 -XX:+UseParallelGC
 *      3.ParNew：-XX:+UseParNewGC  和CMS配合最好
 *          自动激活Old的3   也会暂停其他一切工作线程 只是时间短
 *      4.G1
 * Old Gen(老年代)：
 *      1.Serial Msc（Serial Old）（Tenured）//以前有  废弃了
 *      2.Parallel Compacting（Parallel Old）//自动激活 新生代2
 *      3.CMS （1  Serial Old)可作为CMS的备用收集器
 *          即 CMS坏了（在内）  会自动换成Serial Old 已STW方式进行一次GC
 *      4.G1
 *
 *
 *      由于并发进行，CMS在收集与应用线程会同时会增加对堆内存的占用，
 *      也就是说，CMS必须要在老年代堆内存用尽之前完成垃圾回收，
 *      否则CMS回收失败时，将触发担保机制，串行老年代收集器将会以
 *      STW的方式进行一次GC，从而造成较大停顿时间
 *
 *   CMS收集器(Concurrent Mark Sweep:并发标记清除)
 *   是一种以获取最短回收停顿时间为目标的收集器。
 *   适合应用在互联网站或者B/S系统的服务器上，
 *   这类应用尤其重视服务器的响应速度，希望系统停顿时间最短。
 *   CMS非常适合堆内存大、CPU核数多的服务器端应用，
 *   也是G1出现之前大型应用的首选收集器。
 *
 *   G1:   //已经不分新生代和老年代
 *      是一种面向服务端的垃圾收集器
 *      应对多处理器和大容量的内存       在实现高吞吐量的同时 尽可能的满足垃圾收集暂停时间的要球
 *      目的是取代CMS收集器
 *          G1是一个由整理内存过程的垃圾收集器不会产生很多内存碎片
 *          G1的Stop The  World(STW)更可控，G1在停顿时间上添加了预测机制，用户可以指定期望停顿时间。
 *
 *      1: G1能充分利用多CPU、多核环境硬件优势，尽量缩短STW。
 *      2: G1整体正采用标记-整理算法，局部是通过复制算法，不会产生内存碎片。
 *      3: 宏观上看G1之中不再区分年轻代和老年代。把内存划分成多个独立的子区域(Region),
 *          可以近似理解为一个围棋的棋盘。
 *      4: G1收集器里面讲整个的内存区都混合在一起了，但其本身依然在小范围内要进行年轻代和老年代的区分，
 *          保留了新生代和老年代，但它们不再是物理隔离的，而是一部分Region的集合且不需要Region是连续的，
 *          也就是说依然会采用不同的GC方式来处理不同的区域。
 *      5: G1虽然也是分代收集器，但整个内存分区不存在物理上的年轻代与老年代的区别，
 *         也不需要完全独立的survivor(to space)堆做复制准备。
 *         G1只有逻辑上的分代概念，或者说每个分区都可能随G1的运行在不同代之间前后切换;
 *
 *      -XX:G1HeapRegionSize=n可指定分区大小（1-32  MB）  但必须是2的幂
 *
 *      Region区域化垃圾收集器
 *      Eden     Survivor   Old    Humongous
 *      伊甸园区   幸存区     养老区   巨大的(大对象)
 *
 *
 *      区域化内存划片Region，整体编为了一些列不连续的内存区域，避免了全内存区的GC操作。
 *      核心思想是将整个堆内存区域分成大小相同的子区域(Region),在JVM启动时会自动设置这些子区域的大小，
 *      在堆的使用上，G1并不要求对象的存储一定是物理上连续的只要逻辑上连续即可，
 *      每个分区也不会固定地为某个代服务，可以按需在年轻代和老年代之间切换。
 *      启动时可以通过参数XX:G1HeapRegionSize=n可指定分区大小(1MB~32MB，且必 须是2的幂)，
 *      默认将整堆划分为2048个分区。
 *      大小范围在1MB~32MB，最多能设置2048个区域，
 *          也即能够支持的最大内存为: 32MB * 2048 = 65536MB = 64G内存
 *
 *          在G1中，还有一种特殊的区域，叫Humongous(巨大的)区域
 *      如果一个对象占用的空间超过了分区容量50%以上，G1收集器就认为这是一个巨型对象。
 *      这些巨型对象默认直接会被分配在年老代
 *      但是如果它是一个短期存在的巨型对象，就会对垃圾收集器造成负面影响。
 *      为了解决这个问题，G1划分了一个Humongous区，它用来专门存放巨型对象。
 *      如果一个H区装不下一个巨型对象，那么G1会寻找连续的H分区来存储。
 *      为了能找到连续的H区，有时候不得不启动Full GC。
 *
 *
 *   G1:四部
 *         1.初始标记:只标记  GC Roots能 直接关联到的对象
 *         2.并发标记:进行    GC Roots Tracing的过程
 *         3.最终标记:修正并发标记期间，因程序运行导致标记发生变化的那一部分对象
 *         4.筛选回收:根据时间来进行价值最大化的回收
 *
 * -XX:+UseG1GC
 * -XX:G1HeapRegionSize=n:设置的G1区域的大小。值是2的幂，范围是1MB到32MB。目标是根据最小的Java堆大
 * -XX:MaxGCPauseMillis=n:最大Gc停顿时间，这是i个软目标，JVM将尽可能(但不保证)停顿小于这个时间
 * -XX:InitiatingHeapOccupancyPercent=n:堆占用了多少的时候就触发GC，默认为45
 * -XX:ConcGCThreads=n: 并发Gc使用的线程数
 * -XX:G1ReservePercent=n:设置作为空闲空间的预留内存百分比，以降低目标空间溢出的风险，默认值是10%
 *
 *
 *
 *
 * 32位Window操作系统，不论硬件如何都默认使用Client的JVM模式
 * 32位其它操作系统，2G内存同时有2个cpu以上用Server模式，低于该配置还是Client模式
 * 64位only server模式。
 * server模式:
 *
 *
 */

public class 垃圾回收器 {
    public static void main(String[] args) {

    }
}
